﻿#pragma once

using namespace System;

namespace $RootNamespace$
{

	private ref class $IProduct$ abstract
	{
		//override String GetProductName();
	public:
		virtual System::String ^GetProductName() abstract;
	};


	private ref class CLIDefaultProduct : $IProduct$
	{

	public:
		virtual System::String ^GetProductName() override;
	};


	private ref class $Creator$ abstract
	{
	protected:
		virtual $IProduct$ ^FactoryMethod() abstract;
	public:
		void AnOperation();

		static void Test();

	};

	private ref class CLIConcreteDefaultCreator : $Creator$
	{

	protected:
		virtual $IProduct$ ^FactoryMethod() override;
	};
	private ref class CLIProduct1 : $IProduct$
	{
	public:
		virtual System::String ^GetProductName() override;
	};
	private ref class CLIConcreteCreator1 : $Creator$
	{

	protected:
		virtual $IProduct$ ^FactoryMethod() override;
	};

	private ref class CLIProduct2 : $IProduct$
	{
	public:
		virtual System::String ^GetProductName() override;
	};
	private ref class CLIConcreteCreator2 : $Creator$
	{
	protected:
		virtual $IProduct$ ^FactoryMethod() override;
	};

}
